iT邦幫忙

2023 iThome 鐵人賽

DAY 8
1
自我挑戰組

用ChatGPT詠唱來完成工作與點亮前後端技能樹系列 第 8

【Day8】ChatGPT請教教我:進階JavaScript 、 ES6語法&語法糖

  • 分享至 

  • xImage
  •  

目前這個系列已挑選ChatGPT、前端&React相關章節出版成書!
感謝大家的閱讀與支持!
《用 ChatGPT 詠唱來點亮 React & 前端技能樹》
歷經重新整理、校正、編排、與修改後,讓章節內容之間的銜接更平順,除了補充上更多的解說之外,甚至有部分章節為重新撰寫的內容,讓理解變得更輕鬆!
目前已在天瓏書局博客來金石堂等通路都買得到了! 也有電子書的選擇!
歡迎各位點擊連結選購,謝謝大家~
https://ithelp.ithome.com.tw/upload/images/20240419/20135750lQM12by6v1.jpg


要在前端領域打滾,JS的基礎必須要打穩
雖然程式最基礎的核心不同語言間大同小異,像是迴圈條件等等
但仍然有一些是存在於JS的專用語法

且JS在經歷一番更新之後,有著許多語法糖以及好用的高階函數
因此來試看看ChatGPT能不能來教我們JS的進階語法吧!
https://ithelp.ithome.com.tw/upload/images/20230920/20135750iu7sHmR4Ae.png

好的,讓我們來深入了解一些進階的 JavaScript 概念吧!

1. 物件導向程式設計 (Object-Oriented Programming, OOP)

物件導向程式設計是一種以物件為基礎的程式設計範式,它讓你可以將資料和相關的行為封裝在一起。在 JavaScript 中,物件是 key-value 對的集合,可以用來組織和管理程式碼。

範例

// 建立一個物件
let car = {
    make: 'Toyota',
    model: 'Corolla',
    year: 2022,
    start: function() {
        console.log('引擎啟動!');
    }
};

// 存取物件的屬性
console.log(car.make); // 輸出: Toyota

// 呼叫物件的方法
car.start(); // 輸出: 引擎啟動!

2. 閉包 (Closures)

閉包是指允許函式保留對其創建時作用域的存取權,即使函式在不同的作用域執行也能保持對這個作用域的引用。

範例

function outerFunction() {
    let message = 'Hello';

    function innerFunction() {
        console.log(message);
    }

    return innerFunction;
}

let myFunction = outerFunction();
myFunction(); // 輸出: Hello

3. 非同步程式設計 (Asynchronous Programming)

在 JavaScript 中,非同步程式設計是一個重要的概念,可以避免阻塞程式執行。常用的非同步機制包括回呼函式 (Callback Functions)、Promise 和 async/await。

範例

使用 Promise:

function getData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('資料取得成功');
        }, 2000);
    });
}

getData()
    .then(data => console.log(data)) // 輸出: 資料取得成功
    .catch(error => console.error(error));

使用 async/await:

async function fetchData() {
    try {
        let data = await getData();
        console.log(data); // 輸出: 資料取得成功
    } catch (error) {
        console.error(error);
    }
}

fetchData();

4. 事件驅動程式設計 (Event-Driven Programming)

事件驅動程式設計是一種基於事件和事件處理程序的程式設計方式。在網頁開發中,經常會使用事件來處理使用者的互動。

範例

let button = document.getElementById('myButton');

button.addEventListener('click', function() {
    console.log('按鈕被點擊了!');
});

這些是一些進階的 JavaScript 概念,希望對你有所幫助!如果你對其中任何一個概念有疑問,隨時向我提問。

OK,ChatGPT拋出了四個主題給我們:

物件、閉包、非同步 ( Callback/ Promise / async / await )、事件監聽

得到這幾個範例之後,如果有興趣的就能拿這些關鍵字進行深入追問
繼續問看看有沒有其他關鍵字
https://ithelp.ithome.com.tw/upload/images/20230920/20135750ANdNQbUZAc.png

當然!以下是更多進階的 JavaScript 語法和概念:

1. 生成器函式 (Generator Functions)

生成器函式可以在執行期間被暫停,並在需要時恢復執行,這使得處理大量資料或非同步任務變得更為有效率。

範例

function* generateSequence() {
    yield 1;
    yield 2;
    yield 3;
}

let generator = generateSequence();

console.log(generator.next().value); // 輸出: 1
console.log(generator.next().value); // 輸出: 2
console.log(generator.next().value); // 輸出: 3

2. 模組化程式設計 (Module System)

模組化程式設計讓你可以將程式分割成小的模組,這樣可以更好地組織和維護程式碼。

範例

// 在一個檔案中
// math.js
export function add(a, b) {
    return a + b;
}

export function subtract(a, b) {
    return a - b;
}

// 在另一個檔案中
// main.js
import { add, subtract } from './math.js';

console.log(add(5, 3)); // 輸出: 8
console.log(subtract(5, 3)); // 輸出: 2

3. 類別 (Classes)

JavaScript 支援 ES6 類別,它提供了更接近傳統物件導向程式設計的語法。

範例

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    sayHello() {
        console.log(`Hello, my name is ${this.name}.`);
    }
}

let john = new Person('John Doe', 30);
john.sayHello(); // 輸出: Hello, my name is John Doe.

4. 擴展運算符與剩餘運算符 (Spread and Rest Operators)

擴展運算符(...)可以將陣列或物件展開成單獨的元素,而剩餘運算符(...)則可以將剩餘的參數收集成一個陣列。

範例

// 擴展運算符
let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5, 6];
console.log(arr2); // 輸出: [1, 2, 3, 4, 5, 6]

// 剩餘運算符
function sum(...numbers) {
    return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3, 4)); // 輸出: 10

這些是一些更進階的 JavaScript 語法和概念,希望對你有所幫助!如果你有任何疑問或需要進一步解釋,請隨時告訴我。

欸不錯不錯,又提了四個與上方不同的語法與觀念
而且確實先會一開始提到的物件概念,可能再來了解class與擴展運算符(解構語法)是比較好的

每個觀念都有提供語法範例
不過他看起起來已經參入了一些語法糖的用法在裡面
也用到了像是 .reduce 這樣的和Array 有關的function

看看詢問有關更進階語法會不會吐給我們跟語法糖或是和Array操作有關的內容
https://ithelp.ithome.com.tw/upload/images/20230920/20135750eZpuCqb3d5.png

當然!以下是更多進階的 JavaScript 語法和概念:

1. 异步/等待 (Async/Await)

asyncawait 是用來簡化 Promise 的使用,讓非同步程式碼看起來更像同步程式碼。

範例

function delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function asyncFunction() {
    console.log('開始');

    await delay(2000);

    console.log('等待了 2 秒');

    return '完成';
}

asyncFunction().then(result => console.log(result));

2. Map、Filter 與 Reduce

mapfilterreduce 是用來操作陣列的高階函式,可以更簡潔地處理數據。

範例

let numbers = [1, 2, 3, 4, 5];

let doubled = numbers.map(num => num * 2); // [2, 4, 6, 8, 10]
let even = numbers.filter(num => num % 2 === 0); // [2, 4]
let sum = numbers.reduce((total, num) => total + num, 0); // 15

3. Set 與 Map

Set 是一種集合,它只能包含唯一的值,而 Map 是一種鍵值對的集合。

範例

let set = new Set([1, 2, 3, 2, 1]);
console.log(set); // Set(3) { 1, 2, 3 }

let map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');
console.log(map.get('key1')); // value1

4. Proxy

Proxy 可以在物件上建立一個包裹層,可以在讀取、寫入和其他操作之前或之後進行攔截。

範例

let target = {
    message: 'Hello'
};

let handler = {
    get: function(target, prop) {
        return prop in target ? target[prop] : '無此屬性';
    }
};

let proxy = new Proxy(target, handler);

console.log(proxy.message); // Hello
console.log(proxy.color); // 無此屬性

5. WebSockets

WebSockets 允許瀏覽器和伺服器之間建立雙向通訊通道,這對於即時應用程序非常重要。

範例

let socket = new WebSocket('ws://example.com');

socket.addEventListener('open', event => {
    socket.send('Hello, server!');
});

socket.addEventListener('message', event => {
    console.log('接收到訊息:', event.data);
});

socket.addEventListener('close', event => {
    console.log('連線已關閉');
});

這些是一些更進階的 JavaScript 語法和概念,它們可以幫助你更有效地編寫和組織你的程式碼。如果你對其中任何一個概念有疑問,請隨時向我提問。

還不錯還不錯,雖然Async/Await 和上方的範例有所重複
但又帶了四個新的主題與方向,也介紹了陣列相關的高階函式

打鐵趁熱,拿他所提供的關鍵字繼續問下去

https://ithelp.ithome.com.tw/upload/images/20230920/20135750AHDIQJCNB1.png

當然!以下是更多用於操作陣列的高階函式:

1. findfindIndex

find 用於找到符合條件的第一個元素,而 findIndex 則是返回符合條件的第一個元素的索引。

範例

let numbers = [10, 20, 30, 40, 50];

let foundNumber = numbers.find(num => num > 25);
console.log(foundNumber); // 30

let foundIndex = numbers.findIndex(num => num > 25);
console.log(foundIndex); // 2

2. everysome

every 用於檢查所有元素是否符合特定條件,而 some 則是檢查是否至少有一個元素符合特定條件。

範例

let numbers = [10, 20, 30, 40, 50];

let allGreaterThan10 = numbers.every(num => num > 10);
console.log(allGreaterThan10); // true

let someGreaterThan30 = numbers.some(num => num > 30);
console.log(someGreaterThan30); // true

3. sort

sort 用於排序陣列的元素。

範例

let fruits = ['apple', 'banana', 'cherry', 'date'];

fruits.sort();
console.log(fruits); // ["apple", "banana", "cherry", "date"]

4. reduceRight

reduceRightreduce 類似,但是它是從陣列的末尾開始進行操作。

範例

let numbers = [1, 2, 3, 4, 5];

let sum = numbers.reduceRight((acc, num) => acc + num, 0);
console.log(sum); // 15

5. flatMap

flatMap 是一個組合了 mapflat 的函式,可以將結果平坦化。

範例

let numbers = [1, 2, 3];

let doubledAndFlattened = numbers.flatMap(num => [num * 2]);
console.log(doubledAndFlattened); // [2, 4, 6]

6. splice

splice 可以用來在陣列中插入、刪除或取代元素。

範例

let numbers = [1, 2, 3, 4, 5];

numbers.splice(2, 1, 'a', 'b'); // 從索引 2 開始刪除 1 個元素,並插入 'a' 和 'b'
console.log(numbers); // [1, 2, "a", "b", 4, 5]

這些高階函式能夠幫助你更有效地操作陣列,並使你的程式碼更加簡潔和易於理解。如果你對其中任何一個函式有疑問,請隨時向我提問。

他的回答裡面很自然地用了一些箭頭函式或解構的用法
來問問看「JS的語法糖有哪些」這個問題好了
https://ithelp.ithome.com.tw/upload/images/20230920/20135750GVbD6Pr5iZ.png

JavaScript 的「語法糖」通常指的是一些語法上的簡潔、便利的表達方式,它們並不引入新的功能,但讓程式碼更易讀、寫和理解。

以下是一些 JavaScript 中常見的語法糖:

  1. 箭頭函式 (Arrow Functions)

    箭頭函式提供了一種更簡潔的函式聲明語法。

    // 傳統函式
    function add(a, b) {
        return a + b;
    }
    
    // 箭頭函式
    let add = (a, b) => a + b;
    
    
  2. 模板字串 (Template Literals)

    模板字串允許你在字串中插入變數或執行表達式,並使用反引號 (`) 來定義字串。

    let name = 'John';
    let greeting = `Hello, ${name}!`;
    
    
  3. 解構賦值 (Destructuring Assignment)

    解構賦值讓你可以從陣列或物件中快速提取值並賦予給變數。

    // 陣列解構
    let [a, b] = [1, 2];
    
    // 物件解構
    let { x, y } = { x: 10, y: 20 };
    
    
  4. 展開運算符 (Spread Operator)

    展開運算符 (...) 可以將陣列或物件展開成獨立的元素。

    let arr1 = [1, 2, 3];
    let arr2 = [...arr1, 4, 5, 6];
    
    
  5. Promise 的 async/await

    async/await 提供了一種簡潔的方式來處理 Promise,使非同步程式碼看起來像同步程式碼。

    async function getData() {
        try {
            let response = await fetch('<https://api.example.com/data>');
            let data = await response.json();
            return data;
        } catch (error) {
            console.error('錯誤:', error);
        }
    }
    
    
  6. 類別 (Classes)

    ES6 引入了類別的語法,使得定義物件原型變得更加簡潔。

    class Person {
        constructor(name, age) {
            this.name = name;
            this.age = age;
        }
    
        sayHello() {
            console.log(`Hello, my name is ${this.name}.`);
        }
    }
    
    
  7. 選擇性鏈接 (Optional Chaining)

    選擇性鏈接 (?.) 讓你可以在物件屬性連鎖中避免 nullundefined 的錯誤。

    let user = {
        address: {
            street: '123 Main St',
            city: 'Exampleville'
        }
    };
    
    let city = user?.address?.city;
    
    
  8. 空值合併運算子 (Nullish Coalescing Operator)

    空值合併運算子 (??) 用於處理可能是 nullundefined 的情況。

    let someValue = null;
    let defaultValue = 'Default Value';
    
    let result = someValue ?? defaultValue;
    
    

這些都是 JavaScript 中常見的語法糖,它們可以使你的程式碼更簡潔、易讀且易於維護。當然還有其他許多語法糖,視情況而定。如果你對其中任何一個有疑問,請隨時告訴我!

這幾個對我來說,真的都是很常用到的語法
ChatGPT能一口氣把他整理出來,我覺得非常OK

結語

完整的對話分享連結在這裡:
https://chat.openai.com/share/4f338828-c229-4512-9b9f-ad2050f99378

以上幾個「進階的JS語法」的提問中,
有許多有關Classes與物件操作的議題
以及Promise與async/await 的內容不斷重複

顯然這兩個都是重要的議題,才會不斷的重複

確實在設計模式上,充分運用class特性與物件操作是很重要的語法
一個動態網頁也往往脫離不了需要動態取得資料、發送請求的功能

但這一篇光是講解JS的進階語法就太長了
能熟悉以上的內容使用就真的是蠻進階的JS用法了

分到下篇再來專心問ChatGPT有關異步函數與API串接的問題吧!

我是在前端領域中打滾的一宵三筵,我們明天見


上一篇
【Day7】ChatGPT請教教我:網頁入門 - jQuery
下一篇
【Day9】ChatGPT請教教我:異步Promise、async/await、串接API
系列文
用ChatGPT詠唱來完成工作與點亮前後端技能樹56
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言